package leetcode.bit;

import java.util.Arrays;

/**
 * 给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1：

输入：nums = [2,2,3,2]
输出：3
示例 2：

输入：nums = [0,1,0,1,0,1,99]
输出：99


提示：

1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次
 */
public class LeetCode137_SingleNumber3 {
    /**
     * 出现m次的数，每个位的1加起来是m的倍数
     */
    public int singleNumber(int[] nums) {
        int[] p = new int[32];
        Arrays.fill(p, 0);
        
        for(int i = 0; i < p.length; i++) {
            for (int n : nums) {
                int t = n & (1 << i);
                // 第i位上有多少个1
                p[i] += (t == 0 ? 0 : 1);
            }
        }
        int q = 0;
        for(int i = 0; i < p.length; i++) {
            if (p[i] % 3 != 0) {
                q |= (1 << i);
            }
        }
        return q;
    }
}